// 导出一个axios的实例  而且这个实例要有请求拦截器 响应拦截器
// 引入element提示组件
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router'
import axios from 'axios'
import { getTimeStamp } from '@/utils/auth'
const timeout=3600//超时时间
const service = axios.create({
        baseURL: process.env.VUE_APP_BASE_API,
        timeout: 5000,
    }) // 创建一个axios的实例 避免都挂载到axios 可创建多个axios实例对象。
 // 请求拦截器，处理token，还有错误处理
service.interceptors.request.use(
    // 请求的配置对象
config=>{
    // 如果有token 统一注入 存
    if (store.getters.token) {
         // 只有在有token的情况下 才有必要去检查时间戳是否超时
         if(isCheckTimeOut()){
            // 退出登录 
            store.dispatch('user/logout')
            // 跳转登录页
            router.push('/login')
            // 失败的请求
           
            return Promise.reject(new Error('token超时了'))
         }
        config.headers['Authorization']=`Bearer ${store.getters.token}`
    }
return config
},error=>{
    return Promise.reject(error)
}

) 
    // 响应拦截器，统一处理 处理响应数据结构，异常处理。响应状态码
    // 人资项目的接口,如果执行失败,只是设置了success为false，并没有reject，我们需要一并处理下处理逻辑

service.interceptors.response.use(
    // 响应成功
    response => {
        const { success, message, data } = response.data
        if (success) {
            //返回了数据并且是成功
            // 返回解构后的data
            return data
        } else {
            // 响应啦数据但是是失败的
            Message.error(message)
                // 自己判断应该走 catch 自己new了一个失败对象
            return Promise.reject(new Error(message)) //组件调用的时候会进入catch
        }
    },
    // 响应失败
    error => {
        if(error.response&& err.response.data&&err.response.data.code==='10002'){
        //    token失效啦 后端返回的
         // 退出登录 
         store.dispatch('user/logout')
         // 跳转登录页
         router.push('/login')
        }else{
            Message.error(error.message)
        } 
       
        return Promise.reject(error) //组件调用的时候会进入catch
    }) 
    // 是否超时 函数
// 超时逻辑  (当前时间  - 缓存中的时间) 是否大于 时间差 
function isCheckTimeOut(){
    let currentTime=Date.now()
    let  cookieTiem=getTimeStamp()
    return (currentTime-cookieTiem)/1000 > timeout
}
export default service // 导出axios实例